[...slug].vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <div>
  3. <SldHomeTopSearch />
  4. <NavTopBar />
  5. <NavCatHeader />
  6. <div class="self_background">
  7. <div class="sld_store_list">
  8. <img class="store_list_banner" :src="banneIMG" />
  9. <div class="seller_list_search clearfix">
  10. <input
  11. type="text"
  12. name="sellerName"
  13. :placeholder="L['请输入店铺名称']"
  14. v-model="keyWords"
  15. @keyup.enter="search_store(keyWords)"
  16. />
  17. <button @click="search_store(keyWords)">{{ L["搜索"] }}</button>
  18. </div>
  19. <div class="seller_list">
  20. <div class="fav_list fav_list_box clearfix">
  21. <template v-for="(item, index) in initData.data" :key="index">
  22. <StoreItem :item="item" :ItemIndex="index" :skeleton="firstLoading">
  23. </StoreItem>
  24. </template>
  25. </div>
  26. </div>
  27. </div>
  28. <!-- 分页 start -->
  29. <div class="flex_row_center_center sld_pagination">
  30. <el-pagination
  31. @current-change="handleCurrentChange"
  32. v-model:currentPage="pageData.current"
  33. :page-size="pageData.pageSize"
  34. layout="prev, pager, next"
  35. :total="pageData.total"
  36. :hide-on-single-page="true"
  37. >
  38. </el-pagination>
  39. </div>
  40. <!-- 分页 end -->
  41. </div>
  42. <!-- 空页面 start-->
  43. <SldCommonEmpty v-if="!firstLoading && !initData.data.length" />
  44. <!-- 空页面 end-->
  45. </div>
  46. </template>
  47. <script setup>
  48. import { getCurrentInstance, onMounted, reactive, ref } from "vue";
  49. import { ElPagination } from "element-plus";
  50. import { getCurLanguage } from '@/composables/common.js';
  51. const route = useRoute();
  52. const router = useRouter();
  53. // const L = lang_zn;
  54. const L = getCurLanguage();
  55. const firstLoading = ref(true); //是否第一次加载
  56. const initData = reactive({ data: [] });
  57. const pageData = reactive({
  58. current: 1,
  59. pageSize: 8,
  60. total: null,
  61. });
  62. const keyWords = ref("");
  63. const routeParams = reactive({ data: {} });
  64. const params = reactive({
  65. current: route.params.page,
  66. pageSize: pageData.pageSize,
  67. });
  68. const clacRouteParams = () => {
  69. let arr = route.params.slug;
  70. let newArr = {};
  71. for (let i in arr) {
  72. newArr[arr[i].toString().split("-")[0]] = arr[i].toString().split("-")[1];
  73. }
  74. routeParams.data = newArr;
  75. if (routeParams.data.current) {
  76. params.current = routeParams.data.current;
  77. }
  78. if (routeParams.data.keyword) {
  79. params.keyword = routeParams.data.keyword;
  80. keyWords.value = routeParams.data.keyword;
  81. }
  82. getInitData(params);
  83. };
  84. useHead({
  85. title: "Store List",
  86. });
  87. //获取banner图
  88. const banneIMG = ref('')
  89. const getBannerData = async () => {
  90. const { data: res } = await useFetchRaw(
  91. apiUrl +
  92. "v3/system/front/setting/getSettings?names=default_image_store_list_top"
  93. );
  94. if (res._rawValue.state == 200) {
  95. banneIMG.value = res._rawValue.data[0] == null ? '/store_list_banner.png' : res._rawValue.data[0]
  96. }
  97. };
  98. getBannerData();
  99. //初始化数据
  100. const getInitData = async (params) => {
  101. let searchParams = { ...params };
  102. let keys = "";
  103. if (searchParams.keyword) {
  104. keys += searchParams.keyword;
  105. }
  106. if (searchParams.current) {
  107. keys += searchParams.current;
  108. }
  109. const { data: value, pending: pending } = await useFetchRaw(
  110. apiUrl + "v3/seller/front/store/list",
  111. { params: params, key: keys.toString() }
  112. );
  113. const res = value._rawValue;
  114. if (!pending._rawValue) {
  115. firstLoading.value = false;
  116. }
  117. if (res.state === 200) {
  118. initData.data = res.data.list;
  119. pageData.current = res.data.pagination.current;
  120. pageData.pageSize = res.data.pagination.pageSize;
  121. pageData.total = res.data.pagination.total;
  122. }
  123. };
  124. //分页切换
  125. const handleCurrentChange = (e) => {
  126. params.current = e;
  127. router.push({
  128. path: "/store/list/current-" + e,
  129. });
  130. };
  131. //店铺搜索
  132. const search_store = (keyWord) => {
  133. if (keyWord == "") {
  134. router.push({
  135. path: "/store/list/current-1",
  136. });
  137. } else {
  138. router.push({
  139. path: "/store/list/current-1/keyword-" + keyWord,
  140. });
  141. }
  142. keyWords.value = routeParams.data.keyWord;
  143. params.keyword = keyWord;
  144. getInitData(params);
  145. };
  146. onMounted(() => {
  147. nextTick(() => {
  148. clacRouteParams();
  149. });
  150. });
  151. </script>
  152. <style lang="scss" scoped>
  153. @import "@/assets/style/storeList.scss";
  154. @import "@/assets/style/base.scss";
  155. .sld_pagination {
  156. width: 580px;
  157. margin: 0 auto;
  158. padding: 30px 0;
  159. }
  160. </style>